#include <iostream>
#include <string>
#include <vector>
#include <sw/redis++/redis++.h>

using namespace std;


void test1(sw::redis::Redis& redis)
{
    redis.flushall();
    redis.hset("key", "f1", "111");
    redis.hset("key", make_pair("f2", "222"));
    redis.hset("key", {
        make_pair("f3", "333"),
        make_pair("f4", "444")
    });
    vector<pair<string, string>> fields = {
        make_pair("f5", "555"),
        make_pair("f6", "666")
    };
    redis.hset("key", fields.begin(), fields.end());

    auto res = redis.hget("key", "f1");
    cout << res.value() << endl;
}

void test2(sw::redis::Redis& redis)
{
    redis.flushall();
    redis.hset("key", "f1", "111");
    auto res = redis.hexists("key", "f1");
    cout << res << endl;
}

void test3(sw::redis::Redis& redis)
{
    redis.flushall();
    redis.hset("key", "f1", "111");
    redis.hset("key", "f2", "222");
    redis.hset("key", "f3", "333");
    auto len = redis.hlen("key");
    cout << len << endl;

    auto res = redis.hdel("key", "f1");
    cout << res << endl;
    len = redis.hlen("key");
    cout << len << endl;
}

void test4(sw::redis::Redis& redis)
{
    redis.flushall();
    redis.hset("key", "f1", "111");
    redis.hset("key", "f2", "222");
    redis.hset("key", "f3", "333");

    vector<string> f;
    auto fit = back_inserter(f);
    redis.hkeys("key", fit);
    for(auto& e : f)
    {
        cout << e << endl;
    }

    vector<string> v;
    auto vit = back_inserter(v);
    redis.hvals("key", vit);
    for(auto& e : v)
    {
        cout << e << endl;
    }
}

void test5(sw::redis::Redis& redis)
{
    redis.flushall();
    redis.hmset("key", {
        make_pair("f1", "111"),
        make_pair("f2", "222"),
        make_pair("f3", "333")
    });

    vector<pair<string, string>> v = {
        make_pair("f4", "444"),
        make_pair("f5", "555"),
        make_pair("f6", "666")
    };
    redis.hmset("key", v.begin(), v.end());

    vector<string> res;
    auto it = back_inserter(res);
    redis.hmget("key", {"f1", "f2", "f3"}, it);
    for(auto& e : res)
    {
        cout << e << endl;
    }
}

int main()
{
    sw::redis::Redis redis("tcp://127.0.0.1:6379");
    
    // test1(redis);
    // test2(redis);
    // test3(redis);
    // test4(redis);
    test5(redis);


    return 0;
}